package algotithm.interview.Boss直聘.test3;

/**
 * @author zhouyanxiang
 * @Date 2021-03-2021/3/31-19:52
 */
import java.util.*;


public class Solution {

    public static void main(String[] args) {
        Solution solution = new Solution();
        String s = "3+5 / 2 + (2 - 3)";
        int res = solution.calculate(s);
        System.out.println(res);
    }

    public int calculate (String expression) {
        String s = expression;
        return dfs(s,0)[0];
    }

    public int[] dfs(String s, int index) {
        Stack<Integer> stack = new Stack<>();
        int num = 0;
        char sign = '+';
        for (int i = index; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                num = num * 10 + (c - '0');
            }
            if (c == '(') {
                int[] root = dfs(s,++i);
                num = root[0];
                i = root[1];
            }
            if (i == s.length() - 1 || (!Character.isDigit(c) && c != ' ')) {
                switch (sign) {
                    case  '+' :
                        stack.push(num);
                        break;
                    case  '-':
                        stack.push(-num);
                        break;
                    case  '*':
                        stack.push(num * stack.pop());
                        break;
                    case  '/':
                        stack.push(stack.pop() / num);
                        break;
                    default:
                        break;
                }
                sign = c;
                num = 0;
            }
            if (c == ')') {
                return new int[]{sum(stack),i};
            }
        }
        return new int[]{sum(stack),s.length()};
    }

    public int sum(Stack<Integer> stack) {
        int res = 0;
        while (!stack.isEmpty()) {
            res += stack.pop();
        }
        return res;
    }
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 根据输入的表达式返回计算结果
     * @param expression string字符串 表达式
     * @return int整型
     */
//    public int calculate (String expression) {
//        // write code here
//        String s = expression;
//        Deque<Integer> stack = new ArrayDeque<>();
//        stack.push(1);
//        int sign = 1;
//        int res = 0;
//        int n = s.length();
//        int i = 0;
//        while (i < n) {
//            if (s.charAt(i) == ' ') {
//                i++;
//            } else if (s.charAt(i) == '+') {
//                sign = stack.peek();
//                i++;
//            } else if (s.charAt(i) == '-') {
//                sign = -stack.peek();
//                i++;
//            } else if (s.charAt(i) == '(') {
//                stack.push(sign);
//                i++;
//            } else if (s.charAt(i) == ')') {
//                stack.pop();
//            } else {
//                long num = 0;
//                while (i < n && Character.isDigit(s.charAt(i))) {
//                    num = num * 10 + s.charAt(i) - '0';
//                    i++;
//                }
//                res += sign * num;
//            }
//
//        }
//        return res;
//    }

}